package cn.jsc.user.service.impl;

import cn.jsc.basic.exception.BusinessException;
import cn.jsc.basic.util.SmsUtil;
import cn.jsc.basic.util.StrUtils;
import cn.jsc.user.constant.UserConstant;
import cn.jsc.user.domain.User;
import cn.jsc.user.mapper.UserMapper;
import cn.jsc.user.service.IVerifycodeService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Service;
import org.springframework.util.StringUtils;

import java.util.concurrent.TimeUnit;

/**
 * 短信验证码的业务实现类
 */
@Service
public class VerifycodeServiceImpl implements IVerifycodeService {
    @Autowired
    private UserMapper userMapper;
    @Autowired
    @Qualifier("redisTemplate")
    private RedisTemplate redisTemplate;

    @Override
    public void smsCode(String phone) {
        //1.校验
        //1.1.空值校验
        if(StringUtils.isEmpty(phone)){//如果phone是一个null值或者""
            throw new BusinessException("手机号码不可以为空！！！");
        }
        //1.2.手机号码是否注册过 - t_user
        User user=userMapper.loadByPhone(phone);
        if(user != null){
            throw new BusinessException("您已经注册过了，请直接登录！");
        }

        //2.从redis获取验证码key - value = [register:17683809913] - [9527:12334555555]
        Object obj = redisTemplate.opsForValue().get(UserConstant.REGISTER_CODE_PREFIX + phone);
        //2.1.如果过期了 或 第一次发  - 生成新的验证码
        String code="";
        if(obj == null){
            code = StrUtils.getRandomString(4);
        }else{//2.2.如果没有过期，判断重发时间
            //2.2.1.没有过重发时间 - 抛异常
            Long timeTemp = Long.parseLong(obj.toString().split(":")[1]);
            //没有过重发时间
            if(System.currentTimeMillis()-timeTemp<1*60*1000){
                throw new BusinessException("请不要重复发送验证码!!!");
            }else{
                //2.2.1.过了重发时间 - 直接使用之前的验证码
                code=obj.toString().split(":")[0];
            }
        }
        //3.将验证码保存到redis
        redisTemplate.opsForValue().set(UserConstant.REGISTER_CODE_PREFIX + phone,code+":"+System.currentTimeMillis()
                ,3, TimeUnit.MINUTES);
        //4.调用工具类 - 短信接口发送验证码
        //SmsUtil.send(phone,"你的验证码是：【" + code + "】,请在三分钟内使用!!!");
        System.out.println("你的验证码是：【" + code + "】,请在三分钟内使用!!!");



    }

    @Override
    public void binderCode(String phone) {
        //1.校验
        //1.1.空值校验
        if(StringUtils.isEmpty(phone)){//如果phone是一个null值或者""
            throw new BusinessException("手机号码不可以为空！！！");
        }
        //2.从redis获取验证码key - value = [register:17683809913] - [9527:12334555555]
        Object obj = redisTemplate.opsForValue().get(UserConstant.BINDER_CODE_PREFIX + phone);
        //2.1.如果过期了 或 第一次发  - 生成新的验证码
        String code="";
        if(obj == null){
            code = StrUtils.getRandomString(4);
        }else{//2.2.如果没有过期，判断重发时间
            //2.2.1.没有过重发时间 - 抛异常
            Long timeTemp = Long.parseLong(obj.toString().split(":")[1]);
            //没有过重发时间
            if(System.currentTimeMillis()-timeTemp<1*60*1000){
                throw new BusinessException("请不要重复发送验证码!!!");
            }else{
                //2.2.1.过了重发时间 - 直接使用之前的验证码
                code=obj.toString().split(":")[0];
            }
        }
        //3.将验证码保存到redis
        redisTemplate.opsForValue().set(UserConstant.BINDER_CODE_PREFIX + phone,code+":"+System.currentTimeMillis()
                ,3, TimeUnit.MINUTES);
        //4.调用工具类 - 短信接口发送验证码
        //SmsUtil.send(phone,"你的验证码是：【" + code + "】,请在三分钟内使用!!!");
        System.out.println("你的验证码是：【" + code + "】,请在三分钟内使用!!!");


    }
}
